package org.herac.tuxguitar.io.gervill; import java.util.ArrayList; import java.util.List; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.herac.tuxguitar.gui.TuxGuitar; import org.herac.tuxguitar.gui.util.DialogUtils; public class MidiToAudioSettingsDialog { private class MidiToAudioFormat { private AudioFormat format; private AudioFileFormat.Type[] types; public MidiToAudioFormat(AudioFormat format, AudioFileFormat.Type[] types) { this.format = format; this.types = types; } public AudioFormat getFormat() { return this.format; } public AudioFileFormat.Type[] getTypes() { return this.types; } } protected boolean success; public MidiToAudioSettingsDialog() { super(); } public List<MidiToAudioFormat> getAvailableFormats() { List<MidiToAudioFormat> list = new ArrayList<MidiToAudioFormat>(); AudioFormat srcFormat = MidiToAudioSettings.DEFAULT_FORMAT; AudioFormat.Encoding[] encodings = AudioSystem .getTargetEncodings(srcFormat); for (int i = 0; i < encodings.length; i++) { AudioFormat dstFormat = new AudioFormat(encodings[i], srcFormat .getSampleRate(), srcFormat.getSampleSizeInBits(), srcFormat .getChannels(), srcFormat.getFrameSize(), srcFormat.getFrameRate(), srcFormat.isBigEndian()); AudioInputStream dstStream = new AudioInputStream(null, dstFormat, 0); AudioFileFormat.Type[] dstTypes = AudioSystem .getAudioFileTypes(dstStream); if (dstTypes.length > 0) { list.add(new MidiToAudioFormat(dstFormat, dstTypes)); } } return list; } private GridData getGroupData() { GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.minimumWidth = 300; return data; } public boolean isSameEncoding(AudioFormat f1, AudioFormat f2) { if (f1 == null || f2 == null || f1.getEncoding() == null || f2.getEncoding() == null) { return false; } return (f1.getEncoding().toString().equals(f2.getEncoding().toString())); } public boolean open(final MidiToAudioSettings settings) { this.success = false; final List<MidiToAudioFormat> formats = getAvailableFormats(); final Shell dialog = DialogUtils.newDialog(TuxGuitar.instance().getShell(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); dialog.setLayout(new GridLayout()); dialog.setText("Options"); // ------------------TRACK SELECTION------------------ Group trackGroup = new Group(dialog, SWT.SHADOW_ETCHED_IN); trackGroup.setLayout(new GridLayout(2, false)); trackGroup.setLayoutData(getGroupData()); trackGroup.setText("Audio Format"); // ------------------TRANSPOSE---------------------- Label eLabel = new Label(trackGroup, SWT.NONE); eLabel.setText("File Encoding:"); eLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); final Combo eCombo = new Combo(trackGroup, SWT.DROP_DOWN | SWT.READ_ONLY); eCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); Label tLabel = new Label(trackGroup, SWT.NONE); tLabel.setText("File Type:"); tLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); final Combo tCombo = new Combo(trackGroup, SWT.DROP_DOWN | SWT.READ_ONLY); tCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); int eSelectionIndex = 0; for (int i = 0; i < formats.size(); i++) { MidiToAudioFormat format = (MidiToAudioFormat) formats.get(i); eCombo.add(format.getFormat().getEncoding().toString()); if (isSameEncoding(settings.getFormat(), format.getFormat())) { eSelectionIndex = i; } } if (!formats.isEmpty()) { eCombo.select(eSelectionIndex); updateTypesCombo(settings, formats, eCombo, tCombo); } eCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { updateTypesCombo(settings, formats, eCombo, tCombo); } }); // ------------------BUTTONS-------------------------- Composite buttons = new Composite(dialog, SWT.NONE); buttons.setLayout(new GridLayout(2, false)); buttons.setLayoutData(new GridData(SWT.END, SWT.FILL, true, true)); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.minimumWidth = 80; data.minimumHeight = 25; final Button buttonOK = new Button(buttons, SWT.PUSH); buttonOK.setText(TuxGuitar.getProperty("ok")); buttonOK.setLayoutData(data); buttonOK.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent arg0) { int tIndex = tCombo.getSelectionIndex(); int eIndex = eCombo.getSelectionIndex(); if (eIndex >= 0 && eIndex < formats.size()) { MidiToAudioFormat format = (MidiToAudioFormat) formats.get(eIndex); if (tIndex >= 0 && tIndex < format.getTypes().length) { settings.setType(format.getTypes()[tIndex]); settings.setFormat(format.getFormat()); MidiToAudioSettingsDialog.this.success = true; } } dialog.dispose(); } }); Button buttonCancel = new Button(buttons, SWT.PUSH); buttonCancel.setText(TuxGuitar.getProperty("cancel")); buttonCancel.setLayoutData(data); buttonCancel.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent arg0) { dialog.dispose(); } }); dialog.setDefaultButton(buttonOK); DialogUtils.openDialog(dialog, DialogUtils.OPEN_STYLE_CENTER | DialogUtils.OPEN_STYLE_PACK | DialogUtils.OPEN_STYLE_WAIT); return this.success; } private void updateTypesCombo(MidiToAudioSettings settings, List encodings, Combo eCombo, Combo tCombo) { tCombo.removeAll(); int eIndex = eCombo.getSelectionIndex(); if (eIndex >= 0 && eIndex < encodings.size()) { MidiToAudioFormat encoding = (MidiToAudioFormat) encodings.get(eIndex); AudioFileFormat.Type[] types = encoding.getTypes(); int tSelectionIndex = 0; for (int tIndex = 0; tIndex < types.length; tIndex++) { tCombo.add(types[tIndex] + " (*." + types[tIndex].getExtension() + ")"); if (settings.getType() != null && settings.getType().equals(types[tIndex])) { tSelectionIndex = tIndex; } } tCombo.select(tSelectionIndex); } } }